using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Data.Common;

namespace FiltronASP.Models.DAO.Interfaces
{
    /// <summary>
    /// Interfejs do zarzadzania obiektami z bazy danych.
    /// </summary>
    /// <typeparam name="T">obiekt z bazy</typeparam>
    /// <typeparam name="PK">klucz glowny</typeparam>
    public interface IGenericDAO<T, PK> : IDisposable where T : class
    {
        /// <summary>
        /// Metoda generycznego pobrania wyrazenia odpowiadajego wyborowi klucza glownego.
        /// </summary>
        /// <param name="id">klucz glowny</param>
        /// <returns>wyrazenie z kluczem glownym</returns>
        Expression<Func<T, bool>> GetKeyLambda(PK id);

        /// <summary>
        /// Commit wszystkich zmian.
        /// </summary>
        /// <returns>true, gdy sie uda, false dla porazki</returns>
        bool SubmitChanges();
        
        /// <summary>
        /// Pobieranie obiektu po kluczu glownym.
        /// </summary>
        /// <param name="id">klucz glowny</param>
        /// <returns>rekord o zadanym kluczu glownym lub null, gdy nie ma</returns>
        T FindByPK(PK id);

        /// <summary>
        /// Pobieranie wszystkich obiektow.
        /// </summary>
        /// <returns>liste wszystkich rekordow z tabeli</returns>
        IQueryable<T> FindAll();

        /// <summary>
        /// Usuwanie wskazanego obiektu.
        /// </summary>
        /// <param name="persistentObject">obiekt do usuniecia</param>
        /// <returns>true dla sukcesu, false w przeciwnym razie</returns>
        bool Delete(PK id);

        /// <summary>
        /// Dodawanie wskazanego obiektu.
        /// </summary>
        /// <param name="persistentObject">obiekt do dodania</param>
        /// <returns>dodany obiekt lub null dla porazki</returns>
        T Add(T persistentObject);

    }
}
